package com.kara.woodAgent.agent.wood.node;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.kara.woodAgent.agent.graph.Next;
import com.kara.woodAgent.agent.graph.Node;
import com.kara.woodAgent.agent.model.ModelProvider;
import com.kara.woodAgent.agent.tool.provider.ToolProvider;
import com.kara.woodAgent.agent.wood.context.WoodContext;
import com.kara.woodAgent.agent.wood.model.ExpectedMessage;
import com.kara.woodAgent.agent.wood.model.Plan;
import dev.langchain4j.data.message.AiMessage;
import dev.langchain4j.data.message.SystemMessage;
import dev.langchain4j.data.message.UserMessage;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.chat.request.ChatRequest;
import dev.langchain4j.model.chat.request.ResponseFormat;
import dev.langchain4j.model.chat.request.ResponseFormatType;
import dev.langchain4j.model.chat.response.ChatResponse;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.ArrayList;
import java.util.List;

/**
 * @author tzy
 * @version 1.0
 * @project wood_agent_base
 * @description
 * @date 2025/6/18 10:01:21
 */
public class PlanReviewNode implements Node<WoodContext> {


	private final String systemPrompt = """
			#### 任务
			根据用户输入的  任务计划  和 上一个节点对该任务计划分析生成的子任务执行计划
			分析 子任务执行计划 是否符合任务计划的预期
			如果不符合任务计划的预期，请你给出原因，我将重新进行规划
			#### 重点
			请你重点关注 子任务执行计划 流程是否合理,是否缺少步骤，有多余步骤。
			#### 返回结果
			请你以json 格式作为你的返回，包含以下的字段：
				- type: 要执行的工具消息是否符合任务计划的预期，符合预期就返回 agree ，不符合预期就返回 disagree
				- message: 当不符合任务计划的预期，不符合的原因
			#### 子任务执行计划 节点字段解释
				- id: 任务的唯一id (必须，从1开始，依次递增)
			         	- content 子任务的详细描述 (必须，包括子任务的具体内容)
			         	- status: 固定为 dispatch 字符串 (必须)
			""";
	@Autowired
	private ModelProvider modelProvider;


	private final ToolProvider.ToolServiceHolder serviceHolder;

	public PlanReviewNode(ToolProvider.ToolServiceHolder serviceHolder) {
		this.serviceHolder = serviceHolder;
	}

	@Override
	public Next execute(WoodContext context) {

		List<Plan> plans = context.getPlans();


		ChatLanguageModel chatModel = modelProvider.getChatModel("summary");


		SystemMessage systemMessage = SystemMessage.from(systemPrompt);
		UserMessage userMessage = UserMessage.from(
				"##### 任务计划: " + context.getUserQuestion() + "\n" +
						"##### 子任务执行计划: " + JSON.toJSONString(plans) + "\n"
		);

		ChatRequest request = ChatRequest.builder()
				.responseFormat(ResponseFormat.builder().type(ResponseFormatType.JSON).build())
				.toolSpecifications(serviceHolder.toolSpecifications())
				.messages(List.of(systemMessage, userMessage)).build();

		ChatResponse chatResponse = chatModel.chat(request);
		AiMessage aiMessage = chatResponse.aiMessage();
		JSONObject object = JSON.parseObject(aiMessage.text());
		if ("agree".equals(object.getString("type"))) {
			context.setExpectedMessage(new ExpectedMessage(new ArrayList<>()));
			return Next.NextNode("dispatch").step(aiMessage.toString());
		} else {
			ExpectedMessage expectedMessage = context.getExpectedMessage();
			expectedMessage.setDisAgreeMsg(object.getString("message"));
			return Next.NextNode("planning").step(aiMessage.toString());
		}
	}
}
